import { onUnmounted } from 'vue'

/**
 * 红绿灯模拟函数
 * @param redTime 红灯时间（秒）
 * @param greenTime 绿灯时间（秒）
 * @param yellowTime 黄灯时间（秒）
 * @param cb 可选回调函数，每次灯变化时被调用，接收一个表示当前灯颜色的字符串参数
 */
export const redGreenLight1 = (
    redTime: number,
    greenTime: number,
    yellowTime: number,
    cb?: (lightType: string) => void
) => {
    // 获取起始时间
    const startTime = new Date().getTime()
    // 计算相对于起始时间的经过时间（单位：秒）
    const getTimeSub = () => {
        return Math.floor((new Date().getTime() - startTime) / 100) / 10
    }
    // 计算总循环时间
    const countTime = redTime + greenTime + yellowTime
    // 定义灯循环切换的函数
    const intervalFn = () => {
        // 红灯
        setTimeout(() => {
            console.log('red', getTimeSub())
            cb && cb('red')
        }, 0)
        // 绿灯
        setTimeout(() => {
            console.log('green', getTimeSub())
            cb && cb('green')
        }, redTime)
        // 黄灯
        setTimeout(() => {
            console.log('yellow', getTimeSub())
            cb && cb('yellow')
        }, redTime + greenTime)
    }
    // 初始触发灯循环
    intervalFn()
    // 设置定时器，周期性触发灯循环
    const interval = setInterval(intervalFn, countTime)
    // 组件卸载时清除定时器
    onUnmounted(() => {
        clearInterval(interval)
    })
}

/**
 * 红绿灯模拟函数
 * @param redTime 红灯时间（秒）
 * @param greenTime 绿灯时间（秒）
 * @param yellowTime 黄灯时间（秒）
 * @param cb 可选回调函数，每次灯变化时被调用，接收一个表示当前灯颜色的字符串参数
 */
export const redGreenLight2 = (
    redTime: number,
    greenTime: number,
    yellowTime: number,
    cb?: (lightType: string) => void
) => {
    // 获取起始时间
    const startTime = new Date().getTime()
    // 计算相对于起始时间的经过时间（单位：秒）
    const getTimeSub = () => {
        return Math.floor((new Date().getTime() - startTime) / 100) / 10
    }

    // 定义灯状态循环切换的函数
    const intervalFn = () => {
        // 红灯阶段
        console.log('red', getTimeSub())
        cb && cb('red')
        
        // 绿灯阶段
        setTimeout(() => {
            console.log('green', getTimeSub())
            cb && cb('green')
            
            // 黄灯阶段
            setTimeout(() => {
                console.log('yellow', getTimeSub())
                cb && cb('yellow')
                
                // 切换到下一个灯状态
                setTimeout(() => {
                    intervalFn()
                }, yellowTime)
            }, greenTime)
        }, redTime)
    }

    // 触发灯状态循环
    intervalFn()
}
